#ifndef MTS_H_I2C_H
#define MTS_H_I2C_H

#include "stm32f10x.h"

/**
  * @brief  硬件I2C配置结构体
  * @param  I2Cx: I2C外设选择 (I2C1或I2C2)
  * @param  ClockSpeed: I2C时钟速度
  * @param  OwnAddress: 自身地址
  * @param  AcknowledgedAddress: 应答地址模式 (7位或10位)
  */
typedef struct
{
    I2C_TypeDef* I2Cx;           // I2C外设选择 (I2C1或I2C2)
    uint32_t ClockSpeed;         // I2C时钟速度
    uint16_t OwnAddress;         // 自身地址
    uint16_t AcknowledgedAddress; // 应答地址模式 (7位或10位)
} H_I2C_InitTypeDef;

/**
  * @brief  初始化硬件I2C
  * @param  hI2C: I2C配置结构体指针
  * @retval 无
  */
void H_I2C_Init(H_I2C_InitTypeDef* hI2C);

/**
  * @brief  产生I2C起始信号
  * @param  I2Cx: 要操作的I2C外设
  * @retval 无
  */
void H_I2C_Start(I2C_TypeDef* I2Cx);

/**
  * @brief  产生I2C停止信号
  * @param  I2Cx: 要操作的I2C外设
  * @retval 无
  */
void H_I2C_Stop(I2C_TypeDef* I2Cx);

/**
  * @brief  发送一个字节
  * @param  I2Cx: 要操作的I2C外设
  * @param  Data: 要发送的数据
  * @retval 无
  */
void H_I2C_SendByte(I2C_TypeDef* I2Cx, uint8_t Data);

/**
 *  @brief  发送设备地址
 * @param  I2Cx: 要操作的I2C外设
 * @param  DevAddress: 设备地址
 * @param  Direction: 传输方向，I2C_Direction_Transmitter: 发送 I2C_Direction_Receiver: 接收
 * @retval 无
 */
void H_I2C_SendDevAddress(I2C_TypeDef* I2Cx, uint8_t DevAddress, uint8_t Direction);

/**
  * @brief  等待I2C事件
  * @param  I2Cx: 要操作的I2C外设

/**
  * @brief  接收一个字节
  * @param  I2Cx: 要操作的I2C外设
  * @retval 接收到的数据
  */
uint8_t H_I2C_ReceiveByte(I2C_TypeDef* I2Cx);

/**
  * @brief  发送应答
  * @param  I2Cx: 要操作的I2C外设
  * @param  AckBit: 应答位，0表示应答，1表示非应答
  * @retval 无
  */
void H_I2C_SendAck(I2C_TypeDef* I2Cx, uint8_t AckBit);

/**
  * @brief  接收应答
  * @param  I2Cx: 要操作的I2C外设
  * @retval 接收到的应答位，0表示应答，1表示非应答
  */
uint8_t H_I2C_ReceiveAck(I2C_TypeDef* I2Cx);

/**
  * @brief  检查指定设备是否就绪
  * @param  I2Cx: 要操作的I2C外设
  * @param  DevAddress: 设备地址
  * @param  Trials: 尝试次数
  * @retval 设备状态，0表示就绪，1表示未就绪
  */
uint8_t H_I2C_CheckDevice(I2C_TypeDef* I2Cx, uint8_t DevAddress, uint8_t Trials);

/**
  * @brief  写寄存器
  * @param  I2Cx: 要操作的I2C外设
  * @param  DevAddress: 设备地址
  * @param  RegAddress: 寄存器地址
  * @param  Data: 要写入的数据
  * @retval 无
  */
void H_I2C_WriteReg(I2C_TypeDef* I2Cx, uint8_t DevAddress, uint8_t RegAddress, uint8_t Data);

/**
  * @brief  读寄存器
  * @param  I2Cx: 要操作的I2C外设
  * @param  DevAddress: 设备地址
  * @param  RegAddress: 寄存器地址
  * @retval 读取到的数据
  */
uint8_t H_I2C_ReadReg(I2C_TypeDef* I2Cx, uint8_t DevAddress, uint8_t RegAddress);

/**
  * @brief  连续写多个字节
  * @param  I2Cx: 要操作的I2C外设
  * @param  DevAddress: 设备地址
  * @param  RegAddress: 寄存器起始地址
  * @param  pData: 数据缓冲区指针
  * @param  Length: 数据长度
  * @retval 无
  */
void H_I2C_WriteMulti(I2C_TypeDef* I2Cx, uint8_t DevAddress, uint8_t RegAddress, uint8_t* pData, uint16_t Length);

/**
  * @brief  连续读多个字节
  * @param  I2Cx: 要操作的I2C外设
  * @param  DevAddress: 设备地址
  * @param  RegAddress: 寄存器起始地址
  * @param  pData: 数据缓冲区指针
  * @param  Length: 数据长度
  * @retval 无
  */
void H_I2C_ReadMulti(I2C_TypeDef* I2Cx, uint8_t DevAddress, uint8_t RegAddress, uint8_t* pData, uint16_t Length);

#endif